package ManagedBeans;

import ComponenteDatos.RutaFacadeLocal;
import ComponenteEntidad.Ruta;
import ComponenteEntidad.Ciudad;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

@ManagedBean
@SessionScoped
public class ManagedBeanRuta implements Serializable{

    @EJB
    private RutaFacadeLocal RutaFacade;
    private Ruta objetoRuta;
    private Ruta objetoRutaCrear;
    private Ciudad objetoCiudad;
    private Ciudad objetoCiudad1;
    private List<Ruta> lista;
    private List<SelectItem> objetoItems = new LinkedList<SelectItem>();
    private HashMap<Integer, Ruta> myobjeto = new HashMap<Integer, Ruta>();

    public ManagedBeanRuta() {
        objetoRuta = new Ruta();
        objetoCiudad = new Ciudad();
        objetoCiudad1 = new Ciudad();
        objetoRuta.setIdRuta(1);
        lista = new LinkedList<Ruta>();
        objetoRutaCrear = new Ruta();
        objetoRutaCrear.setRutaDescripcion("");
        objetoRutaCrear.setRutaEstado(true);
    }

    public List<SelectItem> getObjetoItems() {
        lista = new ArrayList<Ruta>();
        objetoItems = new LinkedList<SelectItem>();
        lista = RutaFacade.findAll();
        for (Ruta p : lista) {
            if (p.getRutaEstado() == true) {
                myobjeto.put(p.getIdRuta(), p);
                objetoItems.add(new SelectItem(p, p.getRutaDescripcion()));
            }
        }
        return objetoItems;
    }

    public void setObjetoItems(List<SelectItem> objetoItems) {
        this.objetoItems = objetoItems;
    }

    public Ciudad getObjetoCiudad() {
        return objetoCiudad;
    }

    public void setObjetoCiudad(Ciudad objetoCiudad) {
        this.objetoCiudad = objetoCiudad;
    }

    public Ciudad getObjetoCiudad1() {
        return objetoCiudad1;
    }

    public void setObjetoCiudad1(Ciudad objetoCiudad1) {
        this.objetoCiudad1 = objetoCiudad1;
    }

    public Ruta getObjetoRuta() {
        return objetoRuta;
    }

    public Ruta getObjetoRuta(int id) {
        return (Ruta) myobjeto.get(id);
    }

    public void setObjetoRuta(Ruta objetoRuta) {
        this.objetoRuta = objetoRuta;
    }

    public Ruta getObjetoRutaCrear() {
        return objetoRutaCrear;
    }

    public void setObjetoRutaCrear(Ruta objetoRutaCrear) {
        this.objetoRutaCrear = objetoRutaCrear;
    }

    public List<Ruta> getLista() {
        lista = new LinkedList<Ruta>();
        List<Ruta> listaTemporal = new LinkedList<Ruta>();
        listaTemporal = RutaFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getRutaEstado() == true) {
                lista.add(listaTemporal.get(i));
            }
        }
        return lista;
    }

    public void setLista(List<Ruta> lista) {
        this.lista = lista;
    }

    public HashMap<Integer, Ruta> getMyobjeto() {
        return myobjeto;
    }

    public void setMyobjeto(HashMap<Integer, Ruta> myobjeto) {
        this.myobjeto = myobjeto;
    }

    public void insertar() {
        try {
            if (objetoRutaCrear.getCiudad().getIdCiudad() == objetoRutaCrear.getCiudad1().getIdCiudad()) {
                FacesMessage msg = new FacesMessage("Informacion", "Seleccione Origen y Destino Diferentes");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }
            if (!verificarSiexiste(objetoRutaCrear.getCiudad().getIdCiudad(), objetoRutaCrear.getCiudad1().getIdCiudad())) {
                objetoRutaCrear.setRutaEstado(true);
                objetoRutaCrear.setRutaDescripcion("De " + objetoRutaCrear.getCiudad().getCiudCiudad() + " a " + objetoRutaCrear.getCiudad1().getCiudCiudad());
                RutaFacade.create(objetoRutaCrear);
                objetoRutaCrear = new Ruta();
                FacesMessage msg = new FacesMessage("Informacion", "Registro Ingresado");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            } else {
                FacesMessage msg = new FacesMessage("Informacion", "Ya Existe la Ruta");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void editar() {
        try {
            if (objetoRuta.getCiudad().getIdCiudad() == objetoRuta.getCiudad1().getIdCiudad()) {
                FacesMessage msg = new FacesMessage("Informacion", "Seleccione Origen y Destino Diferentes");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }
            if (!verificarSiexiste(objetoRuta.getCiudad().getIdCiudad(), objetoRuta.getCiudad1().getIdCiudad())) {
                objetoRuta.setRutaDescripcion("De " + objetoRuta.getCiudad().getCiudCiudad() + " a " + objetoRuta.getCiudad1().getCiudCiudad());
                RutaFacade.edit(objetoRuta);
                FacesMessage msg = new FacesMessage("Informacion", "La Ruta se Actualizó Satisfactoriamente");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            } else {
                FacesMessage msg = new FacesMessage("Informacion", "Ya Existe la Ruta");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void eliminar() {
        try {
            objetoRuta.setRutaEstado(false);
            RutaFacade.edit(objetoRuta);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onRowSelect(SelectEvent event) {
        FacesMessage msg = new FacesMessage("Ruta Seleccionado", ((Ruta) event.getObject()).getIdRuta().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowUnselect(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Ruta No seleccionado", ((Ruta) event.getObject()).getIdRuta().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public boolean verificarSiexiste(int id1, int id2) {
        boolean existe = false;
        lista = new LinkedList<Ruta>();
        List<Ruta> listaTemporal = new LinkedList<Ruta>();
        listaTemporal = RutaFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getCiudad().getIdCiudad() == id1 && listaTemporal.get(i).getCiudad1().getIdCiudad() == id2 && listaTemporal.get(i).getRutaEstado() == true) {
                existe = true;
            }
        }

        return existe;
    }
}
